int main() {
    // 读取音频文件
    AudioFile<double> audioFile;    // 创建AudioFile对象，使用double精度存储样本
    if (!audioFile.load("example.wav")) {   // 加载WAV文件
        std::cerr << "Error: Failed to load audio file" << std::endl;
        return 1;
    }

    // 转换为单声道
    std::vector<double> audioData;
    if (audioFile.isStereo()) {
        // 检查是否为立体声文件
        // 将立体声混合为单声道（左右声道平均值）
        for (int i = 0; i < audioFile.getNumSamplesPerChannel(); ++i) {
            audioData.push_back((audioFile.samples[0][i] + audioFile.samples[1][i]) / 2.0);
        }
    } else {
        // 单声道文件直接复制数据
        audioData = audioFile.samples[0];
    }

    size_t N = audioData.size();            // 获取音频样本总数
    double Fs = audioFile.getSampleRate();  // 获取采样率

    // 验证音频数据
    if (N == 0) {
        std::cerr << "Error: No audio data loaded" << std::endl;
        return 1;
    }

    FFT_initialize();           // 初始化FFT计算环境

    // 创建包装器，将audioData数据映射到MATLAB数组结构
    emxArray_real_T *x = emxCreateWrapper_real_T(
        audioData.data(),            // 指向音频数据缓冲区的指针
        static_cast<int>(N),         // 行数 (样本数量)
        1                           // 列数 (单声道)
    );
    if (x == nullptr) {
        std::cerr << "Error: Failed to create input array" << std::endl;
        FFT_terminate();
        return 1;
    }

    // 初始化输出数组
    emxArray_creal_T *y = nullptr;
    emxInitArray_creal_T(&y, 1);  // 初始化复数数组

    // 执行FFT变换
    FFT(x, y);          // 输入x为时域信号，输出y为频域复数表示

    // 获取实际FFT结果长度
    size_t N_fft = y->size[0];

    /// 将MATLAB Coder的复数数组转换为标准C++复数向量
    std::vector<std::complex<double> > fftResult(N_fft);
    for (size_t i = 0; i < N_fft; ++i) {
        fftResult[i] = std::complex<double>(y->data[i].re, y->data[i].im);
    }

    // 计算频谱幅度
    auto magnitude = computeMagnitude(fftResult);       // |FFT| = sqrt(re^2 + im^2)

    // 寻找主导频率
    double dominantFreq = findDominantFrequency(magnitude, Fs, N_fft);

    // 输出结果
    std::cout << "The dominant frequency is: " << dominantFreq << " Hz" << std::endl;

    // 清理资源
    emxDestroyArray_real_T(x);      // 释放输入数组内存
    emxDestroyArray_creal_T(y);     // 释放输出数组内存
    FFT_terminate();                // 清理FFT计算环境

    return 0;
}
